package com.ai.util.luying;

import org.springframework.stereotype.Service;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
import java.io.File;

/**
 * 录音
 *
 * @author houwenpeng
 */
@Service
public class Recorder {


   /* 实现思路如下:
        - **初始化音频格式**：设置音频的编码、采样率等参数。
        - **获取并打开音频输入设备**：通过`AudioSystem.getLine`获取目标数据线，并打开它。
        - **开始录音**：调用`targetDataLine.start()`开始录音。
        - **打印开始录音信息**：输出提示信息。
        - **创建录音线程**：创建一个新线程来处理录音操作。
        - **启动录音线程**：启动新线程。
        - **等待录音线程完成**：主线程等待录音线程完成。
        - **结束**：主线程结束。

     在录音线程中：
         - **创建音频输入流**：从目标数据线创建音频输入流。
         - **创建音频文件**：创建一个名为`cyborg.wav`的文件。
         - **写入音频文件**：将音频输入流写入文件。
         - **是否超过5秒**：判断是否已经录音5秒。
         - **等待100毫秒**：如果没有超过5秒，则等待100毫秒后继续检查。
         - **停止并关闭录音**：超过5秒后，停止并关闭目标数据线。
         - **打印录音完成信息**：输出录音完成的信息。*/

    /**
     * 录音
     * @return
     */
    public String record() {

                // 初始化音频格式
                final AudioFormat audioFormat = new AudioFormat(
                        AudioFormat.Encoding.PCM_SIGNED,
                        44100.0F, 16, 2, 4, 44100.0F, false);

               // 获取音频输入设备信息
                DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);

                try {
                    // 获取并打开音频输入设备
                    final TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
                    targetDataLine.open(audioFormat);

                    // 开始录音
                    targetDataLine.start();
                    System.out.println("开始录音...");

                    // 创建一个线程来处理录音操作
                    Thread thread = new Thread(() -> {
                        // 创建音频输入流和文件
                        AudioInputStream audioInputStream = new AudioInputStream(targetDataLine);
                        File file = new File("robot.wav");

                        try {
                            // 写入音频文件
                            AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, file);
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    });

                    // 启动录音线程
                    thread.start();

                    // 等待录音时长，可通过其他方式控制时长，例如用户输入等
                    // 15秒
                    long startTime = System.currentTimeMillis();
                    long endTime = startTime + 15000;  // 15秒

                    // 循环检查录音时间
                    while (System.currentTimeMillis() < endTime) {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    // 停止并关闭录音
                    targetDataLine.stop();
                    targetDataLine.close();
                    System.out.println("录音完成~~");

                    // 等待录音线程完成
                    try {
                        thread.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } catch (Exception ex) {
                    ex.printStackTrace();
                }

            return "D:\\project\\AI\\robot.wav";
    }


    /**
     * 主函数 主要时测试
     * @param args
     */
    public static void main(String[] args) {

        // 初始化音频格式
        final AudioFormat audioFormat = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100.0F, 16, 2, 4, 44100.0F, false);

        // 获取音频输入设备信息
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);

        try {
            // 获取并打开音频输入设备
            final TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
            targetDataLine.open(audioFormat);

            // 开始录音
            targetDataLine.start();
            System.out.println("开始录音...");

            // 创建一个线程来处理录音操作
            Thread thread = new Thread(() -> {
                // 创建音频输入流和文件
                AudioInputStream audioInputStream = new AudioInputStream(targetDataLine);
                File file = new File("robot.wav");

                try {
                    // 写入音频文件
                    AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, file);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            });

            // 启动录音线程
            thread.start();

            // 等待录音时长，可通过其他方式控制时长，例如用户输入等
            // 15秒
            long startTime = System.currentTimeMillis();
            long endTime = startTime + 15000;  // 15秒

            // 循环检查录音时间
            while (System.currentTimeMillis() < endTime) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            // 停止并关闭录音
            targetDataLine.stop();
            targetDataLine.close();
            System.out.println("录音完成，文件已保存为 cyborg.wav");

            // 等待录音线程完成
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}